package day1;

import java.util.ArrayList;
import java.util.LinkedList;
/*①ArrayList 通过数组实现，一旦我们实例化 ArrayList 无参数构造函数默认为数组初始化长度为 10②add 方法底层实现如果增加的元素个数超过了 10 个，
    那么 ArrayList 底层会新生成一个数组，长度为原数组的 1.5 倍+1，然后将原数组的内容复制到新数组当中，并且后续增加的内容都会放到新数组当中。
    当新数组无法容纳增加的元素时，重复该过程。是一旦数组超出长度，就开始扩容数组。扩容数组调用的方法 Arrays.copyOf(objArr, objArr.length + 1);

  2.LinkedList 底层的数据结构是基于双向循环链表的，且头结点中不存放数据,既然是双向链表，那么必定存在一种数据结构——我们可以称之为节点，节点实例保存业务数据，
    前一个节点的位置信息和后一个节点位置信息
*/
public class System1 {
    public static void main(String[] args) {
//        向ArrayList和LinkedList加入10万个对象,比较性能;再随机删除100个,比较时间.
//
//                baidu ArrayList和LinkedList实现原理，并比较性能（操作加入新值100000次）
//
//        然后随机删除100个数，比较时间，看谁快。

        System1 x = new System1();
        x.a();
        x.b();

    }
    public void a() {
        ArrayList<Object> arrayList = new ArrayList<>();
        int l = (int) (Math.random() * 100000 + 1 - 100);
        long start = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            arrayList.add(i);
        }
        for (int w = l; w < l + 100; w++) {
            arrayList.remove(w);
        }
        long end = System.nanoTime();
        System.out.println(end - start);
    }

    public void b() {
        LinkedList<Object> linkedList = new LinkedList<>();
        int l = (int) (Math.random() * 100000 + 1 - 100);
        long start = System.nanoTime();
        for (int i = 0; i < 100000; i++) {
            linkedList.add(i);
        }
        for (int w = l; w < l + 100; w++) {
            linkedList.remove(w);
        }
        long end = System.nanoTime();
        System.out.println(end - start);
    }

}
